<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    // let 声明变量的 const 声明常量的；var 有什么区别？
    // let 和 var 的区别；

    // console.log(a);
    // let a = 10;
    // var 有变量提升，不会提升赋值 let 没有变量提升。

    // if (true) {
    //   let a = 66;
    // }
    // console.log(a);
    // let 有块级作用域（以{}为基准分割的） var 没有

    // const 也有块级作用域 声明常量的时候，必须赋值 (如果常量声明的是基本数据类型，不允许改变，改变会报错，如果是引用数据类型，是允许改变的)
    // const a = {
    //   age: 10
    // };
    // a.age = 30;
    // a = { age: 20 };
    // console.log(a);

    // let obj = {
    //   name: '张三'
    // }

    // let obj1 = obj;
    // obj1.name = '李四';
    // console.log(obj1);
    // console.log(obj);


    for (var i = 0; i < 10; i++) {
        // console.log(i);
        (function (i) { // 自执行函数
            setTimeout(() => {
                console.log(i);
            }, 1000*i)
        })(i)
    }
// 闭包，一个作用域有权访问另外一个作用域中的变量，我们称为闭包，简单的理解 （函数嵌套函数）


// if (i<10){
//     let i = 0;
//   i++;
//   setTimeout(() => {

//   })
// }
// if (i<10){
//     let i = 1;
//   i++;
//   setTimeout(() => {

//   })
// }


// function a () { // c 是属于 a 作用域的
//   var c = 10;
// }

// 闭包中，变量不会被垃圾回收机制回收。
// function b () {
//     var c = 10;
//     function d () {
//         console.log(c);
//     }
//     d();
// }
// b();

</script>